#include <stdio.h>  
#include <sqlite3.h>  
  
// 打开或创建数据库并返回连接  
sqlite3* open_database(const char* filename) {  
    sqlite3 *db;  
    int rc = sqlite3_open(filename, &db);  
    if (rc != SQLITE_OK) {  
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
        return NULL;  
    }  
    return db;  
}  
  
// 创建表  
int create_table(sqlite3 *db) {  
    const char *create = "CREATE TABLE IF NOT EXISTS user(name TEXT NOT NULL UNIQUE, passwd TEXT NOT NULL);";  
    char *err_msg = 0;  
    int rc = sqlite3_exec(db, create, 0, 0, &err_msg);  
    if (rc != SQLITE_OK) {  
        fprintf(stderr, "创建表失败: %s\n", err_msg);  
        sqlite3_free(err_msg);  
        return -1;  
    }  
    return 0;  
}  
  
// 登录函数  
int login() {  
    sqlite3 *db = open_database("user.db");  
    if (!db) return -1;  
  
    if (create_table(db) != 0) {  
        sqlite3_close(db);  
        return -1;  
    }  
  
    int num;  
    while (1) {  
        printf("**************************登录界面**************************\n");  
        printf("                  1.注册            2.登录\n");  
        scanf("%d", &num);  
  
        if (num == 1) {  
            // 注册  
            char name[20];  
            char passwd[50];  
            printf("请输入用户名：\n");  
            scanf("%19s", name);  
            printf("请输入密码：\n");  
            scanf("%49s", passwd);  
  
            char insert_str[256];  
            snprintf(insert_str, sizeof(insert_str), "INSERT INTO user (name, passwd) VALUES('%s', '%s');", name, passwd);  
            char *err_msg = NULL;  
            int rc = sqlite3_exec(db, insert_str, 0, 0, &err_msg);  
            if (rc != SQLITE_OK) {  
                fprintf(stderr, "插入失败: %s\n", err_msg);  
                sqlite3_free(err_msg);  
                continue; // 让用户重新尝试  
            }  
            printf("注册成功\n");  
        } else if (num == 2) {  
            // 登录  
            char name[20];  
            char passwd[50];  
            printf("请输入用户名：\n");  
            scanf("%19s", name);  
            printf("请输入密码：\n");  
            scanf("%49s", passwd);  
  
            char query[256];  
            snprintf(query, sizeof(query), "SELECT * FROM user WHERE name = '%s' AND passwd = '%s';", name, passwd);  
  
            sqlite3_stmt *stmt;  
            int rc = sqlite3_prepare_v2(db, query, -1, &stmt, 0);  
            if (rc != SQLITE_OK) 
            {  
                fprintf(stderr, "SQL准备失败: %s\n", sqlite3_errmsg(db));  
                continue;  
            }  
            int step_result = sqlite3_step(stmt);  
            if (step_result == SQLITE_ROW) {  
                printf("登录成功\n");  
                sqlite3_finalize(stmt);  
                sqlite3_close(db);  
                return 0;  
            } else {  
                printf("用户名或者密码错误\n");  
                sqlite3_finalize(stmt);  
                continue;  
            }  
        }  
    }  
  
    sqlite3_close(db); // 在实际使用中，这里可能永远不会执行  
    return 0;  
}  
  
int main() 
{  
    login();  
    return 0;  
}